package main

import (
	"errors"
	"github.com/dgrijalva/jwt-go"
	"time"
)

// MyClaims 自定义声明结构体并内嵌jwt.StandardClaims
// jwt包自带的jwt.StandardClaims只包含了官方字段
// 我们这里需要额外记录一个username字段，所以要自定义结构体
// 如果想要保存更多信息，都可以添加到这个结构体中
type MyClaims struct {
	Username string `json:"username"`
	jwt.StandardClaims
}

const TokenExpireDuration = time.Hour * 2

var MySecret = []byte("我的名字是叶炳龙") //注意这里要用byte

func GenerateToken(name string) (string, error) {
	myclaim := MyClaims{
		Username: name,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: time.Now().Add(TokenExpireDuration).Unix(),
			IssuedAt:  time.Now().Unix(),
			Issuer:    "ybl",
			Subject:   "user token for web test",
		},
	}
	////把刚刚的内容加密使用JWT签名算法     这部分就是摘要 ，把内容+hash 生成摘要
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, &myclaim)
	//使用我们自己设置的密钥来生成token ,后面也用该密钥来解密 属于是对称加密，摘要用这个密钥来加密 生成签名，最后返回tokenstring
	tokenString, err := token.SignedString(MySecret)
	if err != nil {
		return "", err
	}
	return tokenString, nil
}
func ParaseToken(tokenString string) (*MyClaims, error) {
	var claims *MyClaims
	token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
		return MySecret, nil
	})
	if err != nil {
		return nil, err
	}
	if token.Valid {
		return claims, nil
	}
	return nil, errors.New("invalid  token")

}
